#include "comm.hpp"

int main()
{
    Init init;

    int shfd = CreateShm();
    // 获取指向共享内存的起始地址
    char* shmaddr = (char*)shmat(shfd,nullptr,0);

    // 向共享内存写入数据
    // 一旦有人把数据写入到共享内存，立马可以看到，无需经过系统调用
    int fd = open(FIFO_FILE,O_RDONLY);      // 等待写入方写入打开之后，自己才会打开文件，向后执行
    if(fd < 0)
    {
        logbook(Fatal,"file open error string: %s, error code: %d",strerror(errno),errno);
        exit(FIFO_OPEN_ERR);
    }
    // struct shmid_ds:表示共享内存段相关信息的结构体
    struct shmid_ds shmds;
    while(true)
    {
        // 在管道接收字符，如果接收到的字符大于0则访问共享内存
        char c;
        ssize_t s = read(fd,&c,1);
        if(s <= 0)break;

        // 直接访问共享内存
        std::cout << "processb say@ " << shmaddr << std::endl;
        sleep(1);

        shmctl(shfd,IPC_STAT,&shmds);
        // shm_segsz:共享内存段的大小，以字节为单位
        std::cout << "shm size: " << shmds.shm_segsz << std::endl;
        // shm_nattch:当前连接到该共享内存段的进程数
        std::cout << "shm nattch: " << shmds.shm_nattch << std::endl;
        // shm_perm.__key:共享内存段的键值
        std::cout << "shm key: 0x" << shmds.shm_perm.__key << std::endl;
        // shm_perm.mode:共享内存段的访问权限
        std::cout << "shm mode: " << shmds.shm_perm.mode << std::endl << std::endl;
    }

    // 取消当前进程和共享内存之间的关联
    shmdt(shmaddr);
    // 删除共享内存
    int rmsh = shmctl(shfd,IPC_RMID,nullptr);
    if(rmsh < 0)
    {
        logbook(Fatal,"delete share memory error: %s",strerror(errno));
        return 3;
    }

    logbook(Debug,"process quit...");
    close(fd);

    return 0;
}